/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-01-26
 * Time: 22:20
 */


class Solution {

//     思路:
//     滑动窗口(需固定窗口大小, 在第一次循环的时候确定)或双指针
//
//     本次以 双指针为例
//     右指针 一直往后遍历, 并增加字母的数量
//     如果数量超过了子串对应字母的数量, 就右移左指针, 知道数量相同
//     为什么当前的长度为 n 就能确定找到结果了呢
//     因为:
//     每次循环: 都保证了 当前字母的数目对应上了, 而其他的字母数 <= 需要的字母数
//     但长度为 n 了, 说明其他的字母的数目都对应上了
    public boolean checkInclusion(String s1, String s2) {
        int len1=s1.length();
        // 记录子串 各个字母的数量
        int[] standard=new int[26];
        for(int i=0;i<len1;i++){
            char ch=s1.charAt(i);
            standard[ch-'a']++;
        }
        int len2=s2.length();
        int left=0;
        for(int right=0;right<len2;right++){
            char ch=s2.charAt(right);
            standard[ch-'a']--;
            // 如果字母数多了, 就右移左边界, 直到对应的字母数目相同
            while(standard[ch-'a']<0){
                standard[s2.charAt(left) - 'a']++;
                left++;
            }
            // 当前字母数对应上了, 长度为 n , 说明其他的字母也对应上了
            // 否则因为保证其他的字母数 <= 需要的字母数, 长度不可能为 n
            if(right-left+1==len1){
                return true;
            }
        }
        return false;
    }
}
